#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Filename: grupo_de_resolucion.py

##
# Módulos del sistema
from datetime import datetime

##
# Módulos propios
# FIXME: este try no iria mas... ver
try:
    from ticket import Ticket
    from empleado import Usuario
    from historial_de_estado import Estado, HistorialDeEstado
    from historial_de_clasificacion import HistorialDeClasificacion
    from intervencion import Intervencion
    from database import TicketBD
except ImportError, error:
    print error
    print "importando ticket..."

class GrupoDeResolucion:
    def __init__(self, grupo):
        """Constructor por defecto.

        Guardo en una variable de instancia 'gupo', para asi despues en las
        susecivas incerciones que tengan asociados este grupo, como por ejemplo
        hacer un 'set' de ticket, ya tengo el dato y no vuelvo a consultar.

        Keyword arguments
        grupo -- type:<class 'lib.database.GrupoDeResolucion'>

        """
        self.grupo_BD = grupo
        self.codigo = grupo.id
        self.estado = grupo.estado
        self.fecha_creacion = grupo.fecha_creacion
        self.descripcion = grupo.descripcion
        self.nombre = grupo.nombre
        self.integrantes = []
        for usuario in grupo.integrantes:
            self.integrantes.append(Usuario(usuario))
        self.clasificaciones = []
        for clasificacion in grupo.clasificaciones:
            self.clasificaciones.append(clasificacion)
            #print clasificacion
            # La idea era generar objetos clasificacion, pero entraba en
            # recursion plena.

class MesaDeAyuda(GrupoDeResolucion):
    def __init__(self, grupo):
        """Constructor por defecto.

        Keyword arguments
        grupo -- type:<class 'lib.database.GrupoDeResolucion'>
        """
        GrupoDeResolucion.__init__(self, grupo)
        # por ahi estaria bueno levantar los ultimos 10 ticket y almacenarlos
        # acá para mostrarlo en la vista inicial
        self.tickets = []

    def crearTicket(self, usuario, empleado, clasificacion, descripcion,
            fecha_creacion):
        """Registra en la BD y agrega a la lista el nuevo ticket.

        Crea una instancia de ticket para agregarla a la self.ticket y hace un
        set en la BD en la tabla Ticket.

        Keyword arguments:
        usuario -- usuario que registro el ticket
        empleado -- empleado solicitante del ticket
        clasificacion -- clasificacion del problema actual
        descripcion -- descripcion del problema
        fecha_creacion -- <type 'datetime.datetime'>

        Return:
        La posicion en la cual se agrego el ticket
        """
        self.tickets.append(Ticket(usuario, empleado,
            clasificacion,descripcion, self, fecha_creacion))
        #print self.tickets
        return len(self.tickets)
        
    def cerrarTicket(self, usuario_logueado, observacion, fecha_cierre, pos):
        """Realiza el cierre del ticket de la posicion 'pos'.

        Keyword arguments:
        usuario_logueado -- usuario que realiza el cierre
        observacion -- observacion de la intervencion
        fecha_cierre -- <type 'datetime.datetime'>

        """
        #Buscar el ticket y cerrarlo
        self.tickets[pos].dar_de_baja(usuario_logueado,
                observacion,
                fecha_cierre)
        self.tickets.pop()
        
    
    def derivarTicket(self, grupo, fecha_derivacion, obs, usuario, pos):
        """Realiza la derivacion del ticket.

        Keyword arguments:
        """
        grupo_a_derivar = GrupoDeResolucion(grupo)
        self.tickets[pos-1].derivarTicket(grupo_a_derivar, fecha_derivacion, obs, usuario)
        self.tickets.remove(self.tickets[pos-1])
        
    def buscarTicket(self,
            empleado,
            ultimo_grupo,
            clasificacion,
            estado,
            nro_ticket,
            fecha_apertura_desde,
            fecha_apertura_hasta,
            fecha_ultimo_cambio_desde,
            fecha_ultimo_cambio_hasta):
        """Busca los tickets que cumplen con lo criterios de busqueda.

        Recorrera la lista de tiket que tenemos en memoria y irá creando la
        'lista_ticket', luego consultará la BD para obtener mas ticket,
        creando con ellos nuevos ticket para ya tenerlos en la memoria.

        Keyword arguments:
        empleado -- <class 'lib.empleado'>
        ultimo_grupo -- <class 'lib.database.GrupoDeResolucionBD'>
        clasificacion -- <class 'lib.database.ClasificacionBD'>
        estado -- <class 'lib.database.EstadoBD'>
        nro_ticket -- int
        fecha_apertura_desde -- <type 'datetime.datetime'>
        fecha_apertura_hasta -- <type 'datetime.datetime'>
        fecha_ultimo_cambio_desde -- <type 'datetime.datetime'>
        fecha_ultimo_cambio_hasta -- <type 'datetime.datetime'>

        Return:
        lista_ticket -- [<class 'lib.ticket'>]
        """
        # Algunos casos
        lista_ticket = []
        if (empleado and clasificacion == "Todas" and
                ultimo_grupo == "Todos" and 
                fecha_apertura_desde == fecha_apertura_hasta and
                fecha_ultimo_cambio_desde == fecha_ultimo_cambio_hasta):
            if nro_ticket:
                # Busco el ticket con ese numero y que sea del empleado
                for ticket in self.tickets:
                    if (ticket.numero == nro_ticket and
                            ticket.empleado == empleado):
                        lista_ticket.append(ticket)
                    break
                if len(lista_ticket):
                    return lista_ticket
                else:
                    ticket, flag = self.buscar_ticket_BD(nro_ticket, empleado)
                    if flag:
                        lista_ticket.append(ticket)
                        return lista_ticket
                    else:
                        return None
            else:
                pass
                # Busco todos los ticket que tenga el empleado
                        
    def buscar_ticket_BD(self, nro_ticket, empleado):
        """Busca en la BD el ticket con el numero 'nro_ticket'.

        Si el empleado es igual a 'empleado' devuelve el ticket. Sino devuelve
        una lista vacia.

        Keyword arguments:
        nro_ticket -- int
        empleado -- type: <class 'lib.empleado'>
        """
        consulta = TicketBD.selectBy(id = nro_ticket,
                empleado_solicitante = empleado.id)
        try:
            # Tenemos el ticket y es del empleado. Creamos el ticket y
            # devolvemos True
            ticket = consulta[0]
            print "Resultado de la busqueda: "
            print ticket
            return ticket, True
            nuevo_ticket = Ticket()
            nuevo_ticket.numero = ticket.id
            nuevo_ticket.empleado = empleado
            nuevo_ticket.usuario_creacion = Usuario(ticket.usuario_creacion)
            if ticket.usuario_cierre:
                nuevo_ticket.usuario_cierre = Usuario(ticket.usuario_cierre)
            else:
                nuevo_ticket.usuario_cierre = None
            nuevo_ticket.grupo_actual = GrupoDeResolucion(ticket.grupo_de_resolucion)
            nuevo_ticket.descripcion = ticket.descripcion
            #import pdb
            #pdb.set_trace()
            nuevo_ticket.fecha_creacion = ticket.fecha_creacion
            nuevo_ticket.fecha_cierre = ticket.fecha_cierre
            # !!!FIXME: estos for lo podemos hacer directamente llamando a las
            # funciones de la variable recien creada 'ticket'. Ver si lo hacemos
            # asi y hacer las pruebas correspondientes.
            # Historial de clasificaciones
            historial_de_clasificacion = []
            for hc in ticket.historial_de_clasificacion:
                clasificacion = hc
                historial_de_clasificacion.append(
                        HistorialDeClasificacion(
                            Clasificacion(clasificacion.clasificacion)))
            nuevo_ticket.historial_de_clasificacion = historial_de_clasificacion
            # Historial de estado
            historial_de_estado = []
            for estado in ticket.historial_de_estado[0].estados:
                historial_de_estado.append(
                        HistorialDeEstado(Estado(estado)))
            nuevo_ticket.historial_de_estado = historial_de_estado
            # Intervenciones
            intervenciones = []
            for intervencion in ticket.intervenciones:
                intervenciones.append(Intervencion(intervencion))
            nuevo_ticket.intervenciones = intervenciones
            return nuevo_ticket, True
        except IndexError, error:
            return "", False

    def armar_ticket(self, ticket_bd):
        """Creará una nueva instancia de Ticket con los datos obtenidos de BD.

        Keyword arguments:
        ticket -- <class 'lib.database.Ticket'>

        """
        import pdb
        #pdb.set_trace()
        ticket = Ticket()
        print "Antes:"
        print ticket_bd.usuario_creacion
        usuario_creacion = Usuario(ticket_bd.usuario_creacion)
        print "Despues: "
        print ticket_bd.usuario_creacion
        usuario_cierre = Usuario(ticket_bd.usuario_cierre)
        grupo_actual = GrupoDeResolucion(ticket_bd.grupo_de_resolucion_)
        descripcion = ticket_bd.descrpcion
        fecha_creacion = ticket_bd.fecha_creacion
        fecha_cierre = ticket_bd.fecha_cierre
        #Asignamos valores
        # !!!FIXME: estos for lo podemos hacer directamente llamando a las
        # funciones de la variable recien creada 'ticket'. Ver si lo hacemos
        # asi y hacer las pruebas correspondientes.
        # Historial de clasificaciones
        historial_de_clasificacion = []
        for hc in ticket_bd.historial_de_clasificacion:
            clasificacion = hc[0]
            historial_de_clasificacion.append(
                    HistorialDeClasificacion(
                        Clasificacion(clasificacion.clasificacion)))
        ticket.historial_de_clasificacion = historial_de_clasificacion
        # Historial de estado
        historial_de_estado = []
        for he in ticket_bd.historial_de_estado:
            estado = he[0]
            historial_de_estado.append(
                    HistorialDeEstado(Estado(estado)))
        ticket.historial_de_estado = historial_de_estado
        # Intervenciones
        intervenciones = []
        for intervencion in ticket_bd.intervenciones:
            intervenciones.append(Intervencion(intervencion))
        ticket.intervenciones = intervenciones
        return ticket

        
class Clasificacion:
    def __init__(self, clasificacion):
        """Breve explicacion del metodo/clase.

        Keyword arguments 
        clasificacion -- type:<class 'lib.database.Clasificacion'>
        """

        self.nombre = clasificacion.nombre
        self.descripcion = clasificacion.descripcion
        self.clasificacion_BD = clasificacion
        self.grupo = GrupoDeResolucion(clasificacion.grupo_)
        self.estado = clasificacion.estado
        self.codigo = clasificacion.id

    def __str__(self):
        return ("Nombre: " + self.nombre +
                "\nDescripcion: " + self.descripcion +
                "\nGrupos: " + self.grupo +
                "\nEstado: " + self.estado +
                "\nCodigo: " + self.codigo)

